/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cuatroenraya.jugadores;
import cuatroenraya.Jugador;
import java.util.Iterator;
import java.util.LinkedList;
import cuatroenraya.jugadores.TableroAlumnoG7;

/**
 *
 * @author Gabriel
 */
public class JugadorAlumnoG7 extends Jugador
{
    private int PROFUNDIDAD_MAXIMA=3;
    private int puntos;
    private int minimo;
    private int maximo;

    public JugadorAlumnoG7()
    {
        
    }

    public LinkedList generarJugadas(TableroAlumnoG7 tab,int jugador)
    {
	LinkedList jugadasGeneradas=new LinkedList();
	for(int i=0;i<tab.getDimensionX();i++)
	{
            for(int j=0;j<tab.getDimensionY();j++)
            {
		if(tab.estaVacio(i,j))
		{
                    JugadaG7 aux=new JugadaG7(jugador,i,j);
                    jugadasGeneradas.add(aux);
                }
            }
        }
	return jugadasGeneradas;
    }

    @Override
    public int[] jugar(int[][] tablero)
    {
	TableroAlumnoG7 tab=new TableroAlumnoG7(tablero);
	JugadaG7 mejorJugada=jugadaMinMax(tab);
        int[] jugada=new int[2];
        jugada[0]=mejorJugada.getX();
        jugada[1]=mejorJugada.getY();
        /*System.out.println("\nMejor Jugadada: (x="+jugada[0]+" y="+jugada[1]+")");*/
	return jugada;
    }

    public JugadaG7 jugadaMinMax(TableroAlumnoG7 tablero)
    {
        JugadaG7 mejorJugada=null;
	LinkedList jugadasPropias=generarJugadas(tablero,tablero.getFichaPropia());
        Iterator it=jugadasPropias.iterator();
	JugadaG7 jugadaPropia=null;
        int maximoPuntaje=-99999;
	while(it.hasNext())
	{
            jugadaPropia=(JugadaG7) it.next();
            int[][] auxCopia = copiarPosiciones(tablero);
            TableroAlumnoG7 auxPropia=new TableroAlumnoG7(auxCopia);
            auxPropia.ocupar(tablero.getFichaPropia(),jugadaPropia.getX(),jugadaPropia.getY());
            puntos=min(auxPropia,1);
            if(puntos>maximoPuntaje)
            {
                maximoPuntaje=puntos;
                mejorJugada=jugadaPropia;
            }
        }
	return mejorJugada;
    }

    public int min(TableroAlumnoG7 tablero,int profundidad)
    {
	if(profundidad==this.PROFUNDIDAD_MAXIMA)
	{
            puntos=evaluarPosicion(tablero,tablero.getFichaContra());
            return puntos;
	}
	else
	{
            minimo=99999;
            LinkedList jugadasContras=generarJugadas(tablero,tablero.getFichaContra());
            Iterator it=jugadasContras.iterator();
            JugadaG7 jugadaContra=null;
            while(it.hasNext())
            {
                jugadaContra=(JugadaG7) it.next();
		int[][] auxCopia=copiarPosiciones(tablero);
                TableroAlumnoG7 auxContra=new TableroAlumnoG7(auxCopia);
		auxContra.ocupar(tablero.getFichaContra(),jugadaContra.getX(),jugadaContra.getY());
		puntos=max(auxContra,profundidad+1);
		if(puntos<minimo)
		{
                    minimo=puntos;
		}
            }
        }
        return minimo;
    }

    public int max(TableroAlumnoG7 tablero,int profundidad)
    {
	if(profundidad==this.PROFUNDIDAD_MAXIMA)
	{
            puntos=evaluarPosicion(tablero,tablero.getFichaPropia());
            return puntos;
	}
	else
	{
            maximo=-99999;
            LinkedList jugadasPropias=generarJugadas(tablero,tablero.getFichaPropia());
            Iterator it=jugadasPropias.iterator();
            JugadaG7 jugadaPropia=null;
            while(it.hasNext())
            {
                jugadaPropia=(JugadaG7) it.next();
		int[][] auxCopia=copiarPosiciones(tablero);
                TableroAlumnoG7 auxPropia=new TableroAlumnoG7(auxCopia);
		auxPropia.ocupar(tablero.getFichaPropia(),jugadaPropia.getX(),jugadaPropia.getY());
		puntos=min(auxPropia,profundidad+1);
		if(puntos>maximo)
		{
                    maximo=puntos;
		}
            }
        }
        return maximo;
    }

    public int evaluarPosicion(TableroAlumnoG7 tablero,int jugador)
    {
        int puntaje=0;
        int lineas=0;
        int columnas=0;
        int diagonales1=0;
        int diagonales2=0;
        for(int i=0;i<tablero.getDimensionX();i++)
        {
            for(int j=0;j<tablero.getDimensionY();j++)
            {
                if(tablero.estaOcupado(i,j))
                {
                    if(j<=4)
                    {
                        lineas+=contarLineas(tablero,i,j,jugador);
                    }

                    if(i<=4)
                    {
                        columnas+=contarColumnas(tablero,i,j,jugador);
                    }

                    if(i<=4 && j<=4)
                    {
                        diagonales1+=contarDiagonales1(tablero,i,j,jugador);
                    }

                    if(i<=4 && j>=3)
                    {
                        diagonales2+=contarDiagonales2(tablero,i,j,jugador);
                    }
                }
            }
        }
        puntaje=lineas+columnas+(diagonales1+diagonales2)/100;//se divide las diagonales por 100, porque no tienen gran incidencia
        return puntaje;
    }

    private int contarLineas(TableroAlumnoG7 tab,
                             int posX,
                             int posY,
                             int jugador)
    {
        if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 1000;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 100;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.estaVacio(posX,posY+1) &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 100;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.estaVacio(posX,posY+2) &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 100;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.estaVacio(posX,posY+3))
	{
		return 100;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.estaVacio(posX,posY+1) &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 10;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.estaVacio(posX,posY+2) &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 10;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.estaVacio(posX,posY+3))
	{
		return 10;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.estaVacio(posX,posY+1) &&
           tab.estaVacio(posX,posY+2) &&
	   tab.getFichaJugador(posX,posY+3)==jugador)
	{
		return 10;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.estaVacio(posX,posY+1) &&
           tab.getFichaJugador(posX,posY+2)==jugador &&
	   tab.estaVacio(posX,posY+3))
	{
		return 10;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX,posY+1)==jugador &&
           tab.estaVacio(posX,posY+2) &&
	   tab.estaVacio(posX,posY+3))
	{
		return 10;
	}

	return 0;
    }

    private int contarColumnas(TableroAlumnoG7 tab,
                               int posX,
                               int posY,
                               int jugador)
    {
        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 1000;
        }

        if(tab.estaVacio(posY,posY) &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 100;
        }

        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.estaVacio(posX+1,posY) &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 100;
        }

        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.estaVacio(posX+2,posY) &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 100;
        }

        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.estaVacio(posX+3,posY))
        {
                return 100;
        }

        if(tab.estaVacio(posX,posY) &&
           tab.estaVacio(posX+1,posY) &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 10;
        }

        if(tab.estaVacio(posX,posY) &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.estaVacio(posX+2,posY) &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 10;
        }

        if(tab.estaVacio(posX,posY) &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.estaVacio(posX+3,posY))
        {
                return 10;
        }

        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.estaVacio(posX+1,posY) &&
           tab.estaVacio(posX+2,posY) &&
           tab.getFichaJugador(posX+3,posY)==jugador)
        {
                return 10;
        }

        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.estaVacio(posX+1,posY) &&
           tab.getFichaJugador(posX+2,posY)==jugador &&
           tab.estaVacio(posX+3,posY))
        {
                return 10;
        }

        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY)==jugador &&
           tab.estaVacio(posX+2,posY) &&
           tab.estaVacio(posX+3,posY))
        {
                return 10;
        }

        return 0;
    }

    private int contarDiagonales1(TableroAlumnoG7 tab,
                                  int posX,
                                  int posY,
                                  int jugador)
    {
        if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.getFichaJugador(posX+3,posY+3)==jugador)
	{
		return 125;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.getFichaJugador(posX+3,posY+3)==jugador)
	{
		return 25;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.estaVacio(posX+1,posY+1) &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.getFichaJugador(posX+3,posY+3)==jugador)
	{
		return 25;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.estaVacio(posX+2,posY+2) &&
	   tab.getFichaJugador(posX+3,posY+3)==jugador)
	{
		return 25;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.estaVacio(posX+3,posY+3))
	{
		return 25;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.estaVacio(posX+1,posY+1) &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.getFichaJugador(posX+3,posY+3)==jugador)
	{
		return 5;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.estaVacio(posX+2,posY+2) &&
	   tab.getFichaJugador(posX+3,posY+3)==jugador)
	{
		return 5;
	}

	if(tab.estaVacio(posX,posY) &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.estaVacio(posX+3,posY+3))
	{
		return 5;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.estaVacio(posX+1,posY+1) &&
	   tab.getFichaJugador(posX+2,posY+2)==jugador &&
	   tab.estaVacio(posX+3,posY+3))
	{
		return 5;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
	   tab.getFichaJugador(posX+1,posY+1)==jugador &&
	   tab.estaVacio(posX+2,posY+2) &&
	   tab.estaVacio(posX+3,posY+3))
	{
		return 5;
	}

        return 0;
    }

    private int contarDiagonales2(TableroAlumnoG7 tab,
                                  int posX,
                                  int posY,
                                  int jugador)
    {
        if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 125;
	}

	if(tab.estaVacio(posX,posY) &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 25;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.estaVacio(posX+1,posY-1) &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 25;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.estaVacio(posX+2,posY-2) &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 25;
	}

	if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.estaVacio(posX+3,posY-3))
	{
		return 25;
	}


	if(tab.estaVacio(posX,posY) &&
           tab.estaVacio(posX+1,posY-1) &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 5;
	}


	if(tab.estaVacio(posX,posY) &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.estaVacio(posX+2,posY-2) &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 5;
	}


	if(tab.estaVacio(posX,posY) &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.estaVacio(posX+3,posY-3))
	{
		return 5;
	}


	if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.estaVacio(posX+1,posY-1) &&
	   tab.estaVacio(posX+2,posY-2) &&
	   tab.getFichaJugador(posX+3,posY-3)==jugador)
	{
		return 5;
	}


	if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.estaVacio(posX+1,posY-1) &&
	   tab.getFichaJugador(posX+2,posY-2)==jugador &&
	   tab.estaVacio(posX+3,posY-3))
	{
		return 5;
	}


	if(tab.getFichaJugador(posX,posY)==jugador &&
           tab.getFichaJugador(posX+1,posY-1)==jugador &&
	   tab.estaVacio(posX+2,posY-2) &&
	   tab.estaVacio(posX+3,posY-3))
	{
		return 5;
	}

        return 0;
    }

    private int[][] copiarPosiciones(TableroAlumnoG7 tablero)
    {
        int m=tablero.getDimensionX();
        int n=tablero.getDimensionY();
        int[][] copia=new int[m][n];
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                copia[i][j]=tablero.getFichaJugador(i,j);
            }
        }
        return copia;
    }

}
